#include "bsp_hx711.h"
#include "stdio.h"
#include "freertos/portmacro.h"
#include "E:\iot_communication\project-name1\components\bsp_rc522\include\bsp_rc522.h"

unsigned int HX711_Buffer;
unsigned int Weight_Maopi;
int Weight_Shiwu;
unsigned char Flag_Error = 0;

//校准参数
//因为不同的传感器特性曲线不是很一致，因此，每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时，增加该数值。
//如果测试出来的重量偏小时，减小改数值。
//该值可以为小数
#define GapValue 232.05

// static void delay_ms(unsigned int ms)
// {
//     vTaskDelay(ms / portTICK_PERIOD_MS);
// }
// static void delay_us(unsigned int us)
// {
//     ets_delay_us(us);
// }
/******************************************************************
 * 函 数 名 称：HX711_GPIO_Init
 * 函 数 说 明：HX711的引脚初始化
 * 函 数 形 参：无
 * 函 数 返 回：无
 * 作       者：LC
 * 备       注：无
******************************************************************/
void HX711_GPIO_Init(void)
{
    gpio_config_t SCK_config = {
            .pin_bit_mask = (1ULL<<HX711_SCK_PIN), //配置引脚
            .mode =GPIO_MODE_OUTPUT,                   //输出模式
            .pull_up_en = GPIO_PULLUP_ENABLE,         //使能上拉
            .pull_down_en = GPIO_PULLDOWN_DISABLE,    //不使能下拉
            .intr_type = GPIO_INTR_DISABLE            //不使能引脚中断
    };
    gpio_config(&SCK_config);

    gpio_config_t DT_config = {
        .pin_bit_mask = (1ULL<<HX711_DT_PIN), //配置引脚
        .mode =GPIO_MODE_INPUT,                   //输入模式
        .pull_up_en = GPIO_PULLUP_ENABLE,         //使能上拉
        .pull_down_en = GPIO_PULLDOWN_DISABLE,    //不使能下拉
        .intr_type = GPIO_INTR_DISABLE            //不使能引脚中断
    };
    gpio_config(&DT_config);
}

/******************************************************************
 * 函 数 名 称：HX711_Read
 * 函 数 说 明：读取HX711
 * 函 数 形 参：无
 * 函 数 返 回：读取到的值
 * 作       者：LC
 * 备       注：无
******************************************************************/
unsigned int HX711_Read(void)        //增益128
{
        unsigned long count;
        unsigned char i;
          DT(1);
        delay_us(1);
          SCK(0);
          count=0;
          while(DT_GET());
          for(i=0;i<24;i++)
        {
                  SCK(1);
                  count=count<<1;
                delay_us(1);
                SCK(0);
                  if(DT_GET())
                        count++;
                delay_us(1);
        }
         SCK(1);
    count=count^0x800000;//第25个脉冲下降沿来时，转换数据
        delay_us(1);
        SCK(0);
        return(count);
}

/******************************************************************
 * 函 数 名 称：Get_Maopi
 * 函 数 说 明：测量初始重量
 * 函 数 形 参：无
 * 函 数 返 回：无
 * 作       者：LC
 * 备       注：后续的重量都是以该初始重量为0值，因此在初始化时，秤上不要放任何东西
******************************************************************/
void Get_Maopi(void)
{
        Weight_Maopi = HX711_Read();
}
/******************************************************************
 * 函 数 名 称：Get_Weight
 * 函 数 说 明：称重
 * 函 数 形 参：无
 * 函 数 返 回：称重值，单位g
 * 作       者：LC
 * 备       注：无
******************************************************************/
float Get_Weight(void)
{
    float Weight=0;
        HX711_Buffer = HX711_Read();
        if(HX711_Buffer > Weight_Maopi)
        {
                Weight_Shiwu = HX711_Buffer - Weight_Maopi;                                //获取实物的AD采样数值。
        Weight = (float)Weight_Shiwu / GapValue;//计算实物的实际重量
        //因为不同的传感器特性曲线不一样，因此，每一个传感器需要矫正这里的GapValue这个除数。
        //当发现测试出来的重量偏大时，增加该数值。
        //如果测试出来的重量偏小时，减小改数值。
        }
    return Weight;
}
